今天我們來認識 Python 中的浮點數,以及如何處理它們。
先來看一下浮點數 float
class 的說明:
help(float)
Help on class float in module builtins:
class float(object)
| float(x=0, /)
|
| Convert a string or number to a floating point number, if possible.
|
float
只有一個引數,可以傳數字也可以是字串:
print(float(10))
10.0
print(float('3.14'))
3.14
不過字串如果是分數就無法轉換:
float('22/7')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/Users/maotingyang/Downloads/Floats - Internal Representation.ipynb Cell 8 in <cell line: 1>()
----> <a href='vscode-notebook-cell:/Users/maotingyang/Downloads/Floats%20-%20Internal%20Representation.ipynb#X11sZmlsZQ%3D%3D?line=0'>1</a> float('22/7')
ValueError: could not convert string to float: '22/7'
如果想轉換分數,可以用昨天學到的 Fraction
類型, 再傳給 float
處理:
from fractions import Fraction
float(Fraction('22/7'))
3.142857142857143
我們印出浮點數 0.1 來觀察一下:
print(0.1)
0.1
乍看之下很正常,但如果我們多看幾個小數點後面位數:
format(0.1, '.25f')
'0.1000000000000000055511151'
為什麼會這樣?因為電腦其實只會二進制,我們看到的十進位 0.1
其實背後是二進制的逼近:
如上圖,加越多 2 冪次項越準,但記憶體有限,不可能無窮項加下去,最終結果總會比 0.1 大一點點,或小一點點。
實際運用上這會有什麼問題呢?有些浮點數運算結果可能跟你想的不一樣:
a = 0.3
print(a == 0.2 + 0.1)
False
不過有些浮點數是可以被精確表示的,就是那些 2^-n 次方的小數:
a = Fraction(1,8)
print(float(a))
format(float(a), '.25f')
0.125
'0.1250000000000000000000000'
好啦,接下來幾天都要在浮點數打轉,我們明天見~~~
參考:Python 3: Deep Dive (Part 1 - Functional)